﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using Maestro_Proveedores.clases.almacen;
using System.Collections;

namespace Maestro_Proveedores.Forms
{
    public partial class AlmDemanda : Form
    {

        string almacen;
        Boolean flag;
        bool esGeneral;
        string codClase;
        DateTime fechaUltimoReporte;
        Demanda demanda;
        ArrayList materialesStockconDemanda;

        public AlmDemanda()
        {
            InitializeComponent();
            almacen = "001";
            esGeneral = false;
            codClase = string.Empty;
            //por defecto se supone la tabla no tiene registros, y se calcularan lod dos años anteriores de transacciones
            fechaUltimoReporte = new DateTime((DateTime.Now.Year - 2), DateTime.Now.Month, DateTime.Now.Day);
            demanda= new Demanda();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (cmbNivelServicio.SelectedIndex >= 0)
            {
                this.Cursor = Cursors.WaitCursor;
                this.progressBar.Value = 0;
                this.progressBar.Maximum = 100;
                int refProgreso = 0;

                if (this.rdButtonGeneral.Checked)
                {
                    esGeneral = true;
                }
                else
                {
                    codClase = comboBoxGrupo.SelectedValue.ToString();
                }

                // se consulta la fecha del ultimo reporte
                _Maestro_Proveedores_CORPORATIVADataSet.ALM_DEMANDA_HISTDataTable alm_DEMANDA_HISTDataTable = new _Maestro_Proveedores_CORPORATIVADataSet.ALM_DEMANDA_HISTDataTable();
                _Maestro_Proveedores_CORPORATIVADataSetTableAdapters.ALM_DEMANDA_HISTTableAdapter alm_DEMANDA_HISTTableAdapter = new Maestro_Proveedores._Maestro_Proveedores_CORPORATIVADataSetTableAdapters.ALM_DEMANDA_HISTTableAdapter();

                fechaUltimoReporte = (DateTime)alm_DEMANDA_HISTTableAdapter.ScalarQueryFechaReporteUlt(almacen);

                //Si existen mas de 5 dias de diferencia entre la generacion del pronostico actual, y la fecha de la ultima generacion de demanda por semana
                if (MAESTROS.ClassVarios.TotalDias(fechaUltimoReporte, DateTime.Now) > 4)
                {
                    MessageBox.Show("La base de datos de demandas por material, debe ser actualizada," + Environment.NewLine + "esto puede tardar unos minutos");
                    lblInfoProgreso.Text = "Consultando transacciones de materiales (2 AÑOS)";
                    lblInfoProgreso.Refresh();
                    lblInfoProgreso.Visible = true;
                    //string tiempo=demanda.generarDemandaMateriales(esGeneral, codClase, almacen, fechaUltimoReporte);
                    string tiempo = demanda.generarDemandaMateriales(almacen, fechaUltimoReporte);

                    //MessageBox.Show(tiempo);
                }
                this.progressBar.Value += 10;

                //Se recorre el listado de todos los materiales con sus respectivos arreglos de demanda, y se genera  para cada uno
                //lista de objetos  MaterialStockDemanda

                lblInfoProgreso.Text = "Generando Demanda por Semanas";
                lblInfoProgreso.Refresh();
                this.progressBar.Value += 20;
                materialesStockconDemanda = demanda.consultarMaterialesStockconDemanda(esGeneral, codClase, almacen, fechaUltimoReporte);

                //Para cada material con demanda se procede a realizar el pronostico
                //se establece el comportamiento = 4 , permite a la fabrica de modelos instanciar todos los modelos establecidos (X 5)

                int comportamiento = 4;
                refProgreso = 60 / materialesStockconDemanda.Count;

                foreach (MaterialStockDemanda material in materialesStockconDemanda)
                {
                    // SI EXISTE DEMANDA PARA EL MATERIAL Se realiza el pronostico
                    if (material.ConDemanda)
                    {
                        //llamamos a la fabrica de modelos dependiendo el comportamiento de la demanda 1 - 2 o 3
                        ModelFactory factory = new ModelFactory();
                        //se instancia la fabrica y se pasa como parametro el comportamiento por defecto (4)
                        factory.createModels(comportamiento);
                        //se tiene unchecked Arreglos con cada uno de los modelos obtenidos.

                        //OTRO PASO DEL PROCESO
                        ArrayList modelosCalculados = factory.calcularPronosticos(material.DemandaMaterial);

                        //se consulta el modelo mas apropiado (presento menor error - ECM mas bajo de los 5 modelos) para la demanda del material
                        material.ModeloFinal = factory.modeloApropiado();
                        //string pronostico = String.Format("{0:0.##}", modeloApropiado.resNideal.pronosticoN1);
                        //string semanaPronostico = "Pronostico de demanda para la semana " + (material.DemandaMaterial.Count + 1) + ":";
                    }
                    this.progressBar.Value += refProgreso;
                }
                this.progressBar.Value = 90;
                #region generacion del pronostico

                this.progressBar.Value += 10;
                #endregion
                lblInfoProgreso.Text = "Fin";
                lblInfoProgreso.Refresh();
                this.Cursor = Cursors.Default;
                MessageBox.Show("El Cálculo del Pronóstico ha finalizado, puede generar el reporte");
                btnReporteConsolidado.Enabled = true;
                btnnuevo.Enabled = true;
                button1.Enabled = false;
            }
            else
            {
                MessageBox.Show("Debe elegir los parametros de consulta"+ Environment.NewLine +"y seleccionar un nivel de servicio valido");
            }
        }

        private void Pronostico_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'cORPORATIVADataSet.ALM_CLASES' Puede moverla o quitarla según sea necesario.
            this.alM_CLASESTableAdapter.Fill(this.cORPORATIVADataSet.ALM_CLASES);
            // TODO: esta línea de código carga datos en la tabla 'cORPORATIVADataSet.ALM_DEMANDA_HIST' Puede moverla o quitarla según sea necesario.
            this.aLM_DEMANDA_HISTTableAdapter.Fill(this.cORPORATIVADataSet.ALM_DEMANDA_HIST);
            // TODO: esta línea de código carga datos en la tabla 'cORPORATIVADataSet.ALM_STOCK_CLASE' Puede moverla o quitarla según sea necesario.
            //this.aLM_STOCK_CLASETableAdapter.Fill(this.cORPORATIVADataSet.ALM_STOCK_CLASE);
        }

        private void rdButtonGrupoMateriales_CheckedChanged(object sender, EventArgs e)
        {
            comboBoxGrupo.Enabled = true;
        }

        private void rdButtonGeneral_CheckedChanged(object sender, EventArgs e)
        {
            comboBoxGrupo.Enabled = false;
        }

        private void rdButtonBocagrande_CheckedChanged(object sender, EventArgs e)
        {
            almacen = "002";
        }

        private void rdButtonMamonal_CheckedChanged(object sender, EventArgs e)
        {
            almacen = "001";
        }

        private void btnReporteConsolidado_Click(object sender, EventArgs e)
        {
            //GENERACION DEL REPORTE
            this.Cursor = Cursors.WaitCursor;
            this.progressBar.Value = 0;
            lblInfoProgreso.Text = "Generando Reporte";
            lblInfoProgreso.Refresh();
            this.progressBar.Value += 50;
            string nivelServicio = cmbNivelServicio.SelectedItem.ToString();

            //string nombreArchivo = "Almacen_" + almacen;

            //if (this.rdButtonGeneral.Checked)
            //{
            //    nombreArchivo += "-Consulta General";
            //}
            //else
            //{
            //    nombreArchivo += "-Grupo_"+comboBoxGrupo.SelectedValue.ToString();
            //}

           // nombreArchivo += "-Pronostico-" + DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day;

            //string ruta= Maestro_Proveedores.herramientas.Exportacion.exportar(demanda.generarReporte(materialesStockconDemanda, nivelServicio), nombreArchivo);
            this.dataGridView.DataSource = demanda.generarReporte(materialesStockconDemanda, nivelServicio);
            Exportacion.Exportacion exp = new Exportacion.Exportacion();
            exp.Exportar(this.dataGridView);

            this.progressBar.Value += 50;
            lblInfoProgreso.Text = "Fin del Reporte:";
            lblInfoProgreso.Refresh();
            this.Cursor = Cursors.Default;
        }

        private void btnnuevo_Click(object sender, EventArgs e)
        {
            materialesStockconDemanda.Clear();
            btnReporteConsolidado.Enabled = false;
            button1.Enabled = true;
            cmbNivelServicio.SelectedIndex = -1;
            btnnuevo.Enabled = false;
            this.progressBar.Value = 0;
            lblInfoProgreso.Text = "no Iniciado";
            lblInfoProgreso.Refresh();
        }

        private void btnHistoricoDemanda_Click(object sender, EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            if (this.rdButtonGeneral.Checked)
            {
                this.alM_DEMANDATableAdapter.FillByCod_Almacen(this.cORPORATIVADataSet.ALM_DEMANDA, almacen);                
            }
            else
            {
                this.alM_DEMANDATableAdapter.FillByCodAlmancenCodClase(this.cORPORATIVADataSet.ALM_DEMANDA, almacen, this.comboBoxGrupo.SelectedValue.ToString());                
            }

            if (this.cORPORATIVADataSet.ALM_DEMANDA.Count > 0)
            {
                this.dataGridView.DataSource = this.cORPORATIVADataSet.ALM_DEMANDA;
                Exportacion.Exportacion exp = new Exportacion.Exportacion();
                exp.Exportar(this.dataGridView);

            }
            else
                MessageBox.Show("No hay registros para Exportar");
            this.Cursor = Cursors.Default;

        }

        

        
    }

}
